<?php

namespace frame;
use frame\Factory;
class Frame
{
    private static $config;
    public static function run()
    {
        self::initConst();
        self::initRoute();
        self::initAutoLoad();
        // 检测方法 ， 类是否存在
        self::check();
        // self::customRoute();
        self::dispach();
    }
    // 初始化常量
    public static function initConst()
    {
        define('DS', DIRECTORY_SEPARATOR);
        define('ROOT_PATH', getcwd() . DS);
        define('APP_PATH', ROOT_PATH . "app" . DS);
        self::$config = include ROOT_PATH . 'config' . DS . 'config.php';
    }
    public static function initAutoLoad()
    {
        session_start();
        spl_autoload_register(function ($className) {
            if (file_exists(ROOT_PATH . str_replace('\\', '/',  $className) . '.php')) require ROOT_PATH . str_replace('\\', '/',  $className) . '.php';
        });
    }
    public static function initRoute()
    {
        // *** 路径问题 （因为目录的名称都为小写，Window服务器大小写可以识别，但Linux服务器不行
        $config = self::$config;
        // 应用
        $p = !empty($_GET['p']) ? $_GET['p'] : $config['default_module'];
        $p = lcfirst($p);
        // 控制器
        $c = !empty($_GET['c']) ? $_GET['c'] : $config['default_controller'];
        // 方法
        $a = !empty($_GET['a']) ? $_GET['a'] : $config['default_action'];
        $c = lcfirst($c);
        define('VIEW_PATH', ROOT_PATH . "app" . DS . $p . DS . 'view' . DS . $c . DS);
        define("APP", $p);
        $c = ucfirst($c);
        define("CONTROLLER", $c);
        $a = lcfirst($a);
        define("ACTION", $a);
    }
    // 自定义路由
    public static function customRoute()
    {
        \frame\Route::load();
    }
    public static function dispach()
    {
        $space = "app\\" . APP . "\\controller\\" . CONTROLLER;
        $obj = Factory::getInstance($space);
        $action = ACTION;
        $obj->$action();
    }
    // 检测方法 ， 类是否存在
    public static function check()
    {
        $class =  "app\\" . APP . "\\controller\\" . CONTROLLER;
        if (!class_exists($class, true))  exit($class . '类不存在');
        if (!method_exists($class, ACTION)) exit(ACTION . '方法不存在');
    }
  
}
